/*
* The shader code below is licensed under the Creative Commons Attribution-Share Alike 3.0 
* license.
*
* You are free:
*	To Share: to copy, distribute, display, and perform the work
*	To Remix: to make derivative works 
*
*	Under the following conditions:
*		* Attribution - You must attribute the work in the manner specified by the author or
*			licensor (but not in any way that suggests that they endorse you or your use of the work).
*		* Share Alike - If you alter, transform, or build upon this work, you may distribute
*			the resulting work only under the same, similar or a compatible license.
*
*		For any reuse or distribution, you must make clear to others the license terms of this work.
*		The best way to do this is with a link to the above web page (http;//www.tesla-engine.net)
*
*		Any of the above conditions can be waived if you get permission from the copyright holder.
*
*		Apart from the remix rights granted under this license, nothing in this license impairs or
*		restricts the author's moral rights.
*/

//
// **** Vertex Shader Inputs ****
//

//
// Position/Vertex Color
//
struct VSInputVc {
	float3 Position : POSITION;
	float4 VertColor : COLOR;
};

//
// Position/Texture Coordinate
//
struct VSInputTx {
	float3 Position : POSITION;
	float2 TexCoord : TEXCOORD;
};

//
// Position/Vertex Color/Texture Coordinate
//
struct VSInputVcTx {
	float3 Position : POSITION;
	float4 VertColor : COLOR;
	float2 TexCoord : TEXCOORD;
};

//
// Position/Normal
//
struct VSInputNm {
	float3 Position : POSITION;
	float3 Normal : NORMAL;
};

//
// Position/Normal/Vertex Color
//
struct VSInputNmVc {
	float3 Position : POSITION;
	float3 Normal : NORMAL;
	float4 VertColor : COLOR;
};

//
// Position/Normal/Texture Coordinate
//
struct VSInputNmTx {
	float3 Position : POSITION;
	float3 Normal : NORMAL;
	float2 TexCoord : TEXCOORD;
};

//
// Position/Normal/Vertex Color/Texture Coordinate
//
struct VSInputNmVcTx {
	float3 Position : POSITION;
	float3 Normal : NORMAL;
	float4 VertColor : COLOR;
	float2 TexCoord : TEXCOORD;
};

//
// Position/Normal/Binormal/Tangent
//
struct VSInputNmBT {
	float3 Position : POSITION;
	float3 Normal : NORMAL;
	float3 Binormal : BINORMAL;
	float3 Tangent : TANGENT;
};

//
// Position/Normal/Vertex Color/Binormal/Tangent
//
struct VSInputNmVcBT {
	float3 Position : POSITION;
	float3 Normal : NORMAL;
	float4 VertColor : COLOR;
	float3 Binormal : BINORMAL;
	float3 Tangent : TANGENT;
};

//
// Position/Normal/Texture Coordinate/Binormal/Tangent
//
struct VSInputNmTxBT {
	float3 Position : POSITION;
	float3 Normal : NORMAL;
	float2 TexCoord : TEXCOORD;
	float3 Binormal : BINORMAL;
	float3 Tangent : TANGENT;
};

//
// Position/Normal/Vertex Color/Texture Coordinate/Binormal/Tangent
//
struct VSInputNmVcTxBT {
	float3 Position : POSITION;
	float3 Normal : NORMAL;
	float4 VertColor : COLOR;
	float2 TexCoord : TEXCOORD;
	float3 Binormal : BINORMAL;
	float3 Tangent : TANGENT;
};

//
// **** Vertex Outputs ****
//

struct VSOutputVc {
	float4 PositionPS : SV_POSITION;
	float4 VertColor : COLOR;
};

struct VSOutputTx {
	float4 PositionPS : SV_POSITION;
	float2 TexCoord : TEXCOORD;
};

struct VSOutputVcTx {
	float4 PositionPS : SV_POSITION;
	float4 VertColor : COLOR;
	float2 TexCoord : TEXCOORD;
};

struct VSOutputNm {
	float4 PositionPS : SV_POSITION;
	float3 PositionWS : TEXCOORD0;
	float3 Normal : TEXCOORD1;
};

struct VSOutputNmVc {
	float4 PositionPS : SV_POSITION;
	float3 PositionWS : TEXCOORD0;
	float3 Normal : TEXCOORD1;
	float4 VertColor : COLOR;
};

struct VSOutputNmTx {
	float4 PositionPS : SV_POSITION;
	float3 PositionWS : TEXCOORD0;
	float3 Normal : TEXCOORD1;
	float2 TexCoord : TEXCOORD2;
};

struct VSOutputNmVcTx {
	float4 PositionPS : SV_POSITION;
	float3 PositionWS : TEXCOORD0;
	float3 Normal : TEXCOORD1;
	float2 TexCoord : TEXCOORD2;
	float4 VertColor : COLOR;
};